// 用于记录生成了哪些配置数据.以方便统一进行同步操作.
import Config from "./Config";
import {globalConfig} from "../consts/GlobalConfig";
import Wx from "../../framework/wx/Wx";

const CONFIGS: { [key: string]: Config; } = {};
// 需要保存的CONFIG.
const SAVING_CONFIGS: { [key: string]: Config; } = {};

/**
 * 子类的属性初始化不能放在父类中处理.因此增加一层处理调用.
 * 在构造函数之后调用配置信息的加载过程
 * @param clz
 */
export function getConfig<T extends Config>(clz: { new(): T }): T {
    const t = new clz();
    if (CONFIGS[t.getConfigName()]) {
        console.warn("重复生成相同配置信息.");
        return CONFIGS[t.getConfigName()] as T;
    }
    t.init();
    CONFIGS[t.getConfigName()] = t;
    return t;
}

/**
 * 获取全新的默认配置数据.
 * @param conf
 */
export function getDefaultConfig<T extends Config>(conf: T): T {
    return conf.constructor();
}

export async function clearConfigs(keys?: string[]) {
    const promises = [];
    for (let config in CONFIGS) {
        if (CONFIGS.hasOwnProperty(config)) {
            // 如果keys为空或者包含某配置. 则进行清除.
            if (!keys || keys.length == 0 || keys.indexOf(config) >= 0) {
                promises.push(CONFIGS[config].clear());
            }
        }
    }
    return Promise.all(promises)
}

/**
 * 从网络同步所有配置信息.
 */
export function syncConfigsFromNet() {
    // 判断是否需要清除数据.
    if (globalConfig.needClear) {
        clearConfigs(globalConfig.clearFlag.keys).then(() => {
            cc.log("数据清除完成,程序退出.");
            Wx.exit();
        });
        return;
    }
    for (let config in CONFIGS) {
        if (CONFIGS.hasOwnProperty(config)) {
            CONFIGS[config].syncFromNet()
        }
    }
}

// Config调用Save时,进行暂存.
export function onConfigSave(config: Config) {
    SAVING_CONFIGS[config.getConfigName()] = config;
}

/**
 * 通知所有Config 进行保存.
 */
export function notifyConfigSave() {
    cc.log("窗口最小化,开始保存数据.");
    for (let config in SAVING_CONFIGS) {
        if (SAVING_CONFIGS.hasOwnProperty(config)) {
            SAVING_CONFIGS[config].saveReal();
            delete SAVING_CONFIGS[config];
        }
    }
}